package com.example.demo.util;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Author: zjq
 * @Date: create in 2023/6/16 10:06
 */
public class ImageUtils {

    //图片大后续需要压缩
    public static void main(String[] args) throws IOException {
        // 读取原图片信息 得到文件（本地图片）
        File srcImgFile = new File("C:\\Users\\THINK\\Desktop\\1.jpg");
        creatWatermark(srcImgFile, "浙江杭州", "8509@qq.com");
    }

    /**
     * @param srcImgFile
     * @param address    地址信息
     * @param username   用户名
     * @throws IOException
     */
    public static void creatWatermark(File srcImgFile, String address, String username) throws IOException {
        //将文件对象转化为图片对象
        Image srcImg = ImageIO.read(srcImgFile);
        //获取图片的宽
        int srcImgWidth = srcImg.getWidth(null);
        //获取图片的高
        int srcImgHeight = srcImg.getHeight(null);
        int fontSize = (srcImgWidth + srcImgHeight) / 80;
        System.out.println("图片的宽:" + srcImgWidth);
        System.out.println("图片的高:" + srcImgHeight);
        //创建一个URL对象,获取网络图片的地址信息（网络图片）
//        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
//        //将URL对象输入流转化为图片对象 (url.openStream()方法，获得一个输入流)
//        Image srcImg = ImageIO.read(url.openStream());
//        //获取图片的宽
//        int srcImgWidth = srcImg.getWidth(null);
//        //获取图片的高
//        int srcImgHeight = srcImg.getHeight(null);
//        System.out.println("图片的宽:"+srcImgWidth);
//        System.out.println("图片的高:"+srcImgHeight);

        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        //创建画笔
        Graphics2D g = bufImg.createGraphics();
        //绘制原始图片
        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);


        //-------------------------文字水印 start----------------------------
        //new Color四个参数为 rgba,值可以为 0-255, r红,g绿,b蓝,a透明度
        g.setColor(new Color(255, 255, 255, 130));
        //设置字体  画笔字体样式为微软雅黑，加粗，文字大小
        g.setFont(new Font("微软雅黑", Font.PLAIN, fontSize));

        //设置水印的坐标(为原图片中间位置)
        int x1 = srcImgWidth - getStrWidth(address, fontSize) - (2 * fontSize);
        int x2 = srcImgWidth - getStrWidth(username, fontSize) - (2 * fontSize);
        int y = srcImgHeight - 2 * fontSize;

        //画出水印 第一个参数是水印内容，第二个参数是x轴坐标，第三个参数是y轴坐标
        g.drawString(address, x1, y);
        g.drawString(username, x2, y + fontSize);

        // 绘制几个水印/分成几份
        int num = 5;
        // 每一份x,y的大小
        int splitX = srcImgWidth / num, splitY = srcImgHeight / num;
        // 每一份中间的位置
        int centerX = splitX / 2, centerY = splitY / 2;
        // 设置旋转角度,可以为0-1
        g.rotate(0.3);
        g.setColor(new Color(255, 255, 255, 60));
        String waterMarkContent = "测试项目的水印";        //项目名称
        for (int i = 1; i <= num; i++) {
            int x3 = splitX * i - centerX - fontSize, y3 = splitY * i - centerY - fontSize;
            g.drawString(waterMarkContent, x3, y3);
        }
        g.dispose();
        //-------------------------文字水印 end----------------------------


        ////-------------------------图片水印 start----------------------------
        //// 水印文件
        //String waterMarkImage = "F:/image/s.png";
        //Image srcWaterMark = ImageIO.read(new File(waterMarkImage));
        ////获取水印图片的宽度
        //int widthWaterMark = srcWaterMark.getWidth(null);
        ////获取水印图片的高度
        //int heightWaterMark = srcWaterMark.getHeight(null);
        ////设置 alpha 透明度：alpha 必须是范围 [0.0, 1.0] 之内（包含边界值）的一个浮点数字
        //g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
        ////绘制水印图片  坐标为中间位置
        //g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
        //        (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
        //// 水印文件结束
        //g.dispose();
        ////-------------------------图片水印 end----------------------------


        //待存储的地址
        String tarImgPath = "C:\\Users\\THINK\\Desktop\\t.png";
        // 输出图片
        FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
        ImageIO.write(bufImg, "png", outImgStream);
        System.out.println("添加水印完成");
        outImgStream.flush();
        outImgStream.close();
    }


    /**
     * 获取字符串占用的宽度
     * <br>
     *
     * @param str      字符串
     * @param fontSize 文字大小
     * @return 字符串占用的宽度
     * @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
     */
    public static int getStrWidth(String str, int fontSize) {
        char[] chars = str.toCharArray();
        int fontSize2 = fontSize / 2;

        int width = 0;

        for (char c : chars) {
            int len = String.valueOf(c).getBytes().length;
            // 汉字为3,其余1
            // 可能还有一些特殊字符占用2等等,统统计为汉字
            if (len != 1) {
                width += fontSize;
            } else {
                width += fontSize2;
            }
        }

        return width;
    }

}
